/**
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function (n) {
  // 使用Set记录已经出现过的数字，用于检测循环
  const seen = new Set();

  // 当数字不等于1且未出现过循环时，继续迭代
  while (n !== 1 && !seen.has(n)) {
    // 将当前数字加入已出现集合
    seen.add(n);
    // 计算下一个数字（各位数字的平方和）
    n = getNext(n);
  }

  // 如果最终数字为1，说明是快乐数；否则是循环
  return n === 1;
};

/**
 * 辅助函数：计算数字n的各位数字的平方和
 * @param {number} n - 输入的数字
 * @return {number} - 各位数字的平方和
 */
function getNext(n) {
  let sum = 0;
  // 逐位处理数字n
  while (n > 0) {
    // 获取最后一位数字
    const digit = n % 10;
    // 累加该位数字的平方
    sum += digit * digit;
    // 移除最后一位数字（向下取整）
    n = Math.floor(n / 10);
  }
  return sum;
}